////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////表示的是在阻塞状态下的返回情况////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<iostream>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>

using namespace std;

int main()
{
    pid_t id = fork();
    assert(id != -1);
    if(id == 0){
        int cnt = 10;
        while(cnt--){
            /*
             * 测试的是test3中的execl的自定义环境变量
            cout << "I am child pid:" << getpid() << " "<< "ppid:" << getppid() << " " << cnt << endl;
            cout << "PATH:" << " " << getenv("PATH") << endl;
            cout << "HOME:" << " " << getenv("HOME") << endl;
            cout << "PWD:" << " " << getenv("PWD") << endl;
            cout << "MYENV:" << " " << getenv("MYENV") << endl;
            */
            sleep(1);
        }
        _exit(11);
    }
    int status = 0;
    while(1){
       // pid_t myid = waitpid(id,&status,WNOHANG);//WHOHANG表示的是非阻塞状态->子进程没有exit，父进程检测的时候，就返回
        //测试的是调用错误情况
        pid_t myid = waitpid(id+1,&status,WNOHANG);//WHOHANG表示的是非阻塞状态->子进程没有exit，父进程检测的时候，就返回
        if(myid == 0){//对应的就是设则的WHOHANG的情况
            //waitpid调用成功 && 子进程没有退出
            //子进程没有退出的话，那么waitpid就没有等待失败，仅仅是检测了子进程没有退出
            cout << "wait done,but child is running....." << endl;
        }
        else if(myid > 0){
            //waitpid调用成功 && 子进程安全退出
            cout << "wait succes,sig number:" << (status&0x7F) << " " << "exit code:" << ((status>>8)&0xFF) << endl;

            break;
        }
        else{
            //waitpid调用失败了，直接退出
            cout << "waitpid call failed" << endl;
            break;
        }
        sleep(1);

    }
    return 0;
}
